package com.reportes;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Date;

import javax.servlet.http.HttpServletRequest;

import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JRResultSetDataSource;

import com.Reporte;
import com.util.Util;

import exceptions.InvalidArgumentException;

public class AccionEspecificaConsolidado extends Reporte {

	private static final String ID_ACCION_ESPECIFICA = "accionEspecificaId";
	private static final String ID_ESTADO = "estadoId";
	private static final String ID_MUNICIPIO = "municipioId";
	private static final String ID_PARROQUIA = "parroquiaId";
	private static final String FECHADESDE = "fechaDesde";
	private static final String FECHAHASTA = "fechaHasta";
	private String criterioSQL = " WHERE TRUE ";

	@Override
	public void VerificarParametros(HttpServletRequest request) throws InvalidArgumentException {
		Integer id = Util.toInteger(request.getParameter(ID_ACCION_ESPECIFICA));
		if (id != null){
			criterioSQL = " AND Accion_especifica.id =" + id;
			return;
		}
		if (request.getParameter(FECHADESDE) != null || request.getParameter(FECHAHASTA) != null) {
			Date fechaDesde = Util.toDate(request.getParameter(FECHADESDE),	FECHADESDE);
			Date fechaHasta = Util.toDate(request.getParameter(FECHAHASTA),	FECHADESDE);
			if (fechaDesde.getTime() > fechaHasta.getTime())
				throw new InvalidArgumentException("El parametro fechaDesde es mayor al parametro fechaHasta");
			criterioSQL += " and accion_especifica.fecha_inicio>='" + request.getParameter(FECHADESDE) + "'" +
						   " and accion_especifica.fecha_fin<='" + request.getParameter(FECHAHASTA) + "'";
		}
		id = Util.toInteger(request.getParameter(ID_ESTADO));
		if (id != null)
			criterioSQL = " AND estado.id= "+ id;
		id = Util.toInteger(request.getParameter(ID_MUNICIPIO));
		if (id != null)
			criterioSQL = " AND municipio.id= "+ id;
		id = Util.toInteger(request.getParameter(ID_PARROQUIA));
		if (id != null)
			criterioSQL = " AND parroquia.id= "+ id;
		if (criterioSQL.equals(" WHERE TRUE "))
			throw new InvalidArgumentException("Debe Seleccionar algun Criterio de Consulta");

	}

	@Override
	public Object clone() throws CloneNotSupportedException {
		AccionEspecificaConsolidado reporte = new AccionEspecificaConsolidado();
		copyAttributesTo(reporte);
		return reporte;
	}

	@Override
	protected JRDataSource executeQuery(Connection connection) throws SQLException {
		StringBuffer sql =
			new StringBuffer("SELECT")
		.append(" Proyecto.id as proyectoid,")
		.append(" Proyecto.nombre as proyectonombre,")
		.append(" Accion_general.id as accion_generalid,")
		.append(" Accion_general.nombre as anombre,")
		.append(" Accion_especifica.id as accion_especifica_id,")
		.append(" Accion_especifica.contenido_criterio,")
		.append(" Accion_especifica.fecha_inicio,")
		.append(" Accion_especifica.fecha_fin,")
		.append(" Estado.nombre as enombre,")
		.append(" Municipio.nombre as mnombre,")
		.append(" Parroquia.nombre as pnombre,")
		.append(" Caserio.nombre as canombre,")
		.append(" (Accion_especifica.fecha_fin - Accion_especifica.fecha_inicio) AS duracion")
		.append(" FROM")
		.append(" Accion_especifica")
		.append(" INNER JOIN Accion_general ON (Accion_especifica.accion_general_id = accion_general.id)")
		.append(" INNER JOIN Proyecto ON (Accion_general.proyecto_id = Proyecto.id)")
		.append(" INNER JOIN Caserio ON (Accion_especifica.caserio_id = Caserio.id)")
		.append(" INNER JOIN Parroquia ON (Caserio.parroquia_id = Parroquia.id)")
		.append(" INNER JOIN Municipio ON (parroquia.municipio_id = Municipio.id)")
		.append(" INNER JOIN Estado ON (Estado.id = municipio.estado_id)")
//		.append(" WHERE accion_especifica.id <= 100")
		.append(criterioSQL)
		.append(" ORDER BY ")
		.append(" Proyecto.nombre,Accion_especifica.fecha_fin,")
		.append(" Estado.nombre,Municipio.nombre,")
		.append(" Parroquia.nombre,Caserio.nombre");
		Statement statement = connection.createStatement();
		ResultSet rs = statement.executeQuery(sql.toString());
		setParametrosJasper("SUBREPORT_DIR", "/jasper/AccionEspecificaConsolidado/");
		setParametrosJasper("REPORT_CONNECTION", connection);
		return new JRResultSetDataSource(rs);
	}

}
